/*
 * Copyright 2006 The Apache Software Foundation Licensed under the Apache
 * License, Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
 * or agreed to in writing, software distributed under the License is
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */

package org.apache.ibatis.ibator.api.dom.java;

/**
 * @author Jeff Butler
 */
public class PrimitiveTypeWrapper extends FullyQualifiedJavaType
{
	private static PrimitiveTypeWrapper booleanInstance;
	private static PrimitiveTypeWrapper byteInstance;
	private static PrimitiveTypeWrapper characterInstance;
	private static PrimitiveTypeWrapper doubleInstance;
	private static PrimitiveTypeWrapper floatInstance;
	private static PrimitiveTypeWrapper integerInstance;
	private static PrimitiveTypeWrapper longInstance;
	private static PrimitiveTypeWrapper shortInstance;

	private String toPrimitiveMethod;

	/**
	 * Use the static getXXXInstance methods to gain access to one of the type
	 * wrappers.
	 * 
	 * @param fullyQualifiedName
	 *            fully qualified name of the wrapper type
	 * @param toPrimitiveMethod
	 *            the method that returns the wrapped primitive
	 */
	private PrimitiveTypeWrapper(String fullyQualifiedName,
			String toPrimitiveMethod)
	{
		super(fullyQualifiedName);
		this.toPrimitiveMethod = toPrimitiveMethod;
	}

	public String getToPrimitiveMethod()
	{
		return toPrimitiveMethod;
	}

	public static PrimitiveTypeWrapper getBooleanInstance()
	{
		if (booleanInstance == null)
		{
			booleanInstance = new PrimitiveTypeWrapper("java.lang.Boolean", //$NON-NLS-1$
					"booleanValue()"); //$NON-NLS-1$
		}

		return booleanInstance;
	}

	public static PrimitiveTypeWrapper getByteInstance()
	{
		if (byteInstance == null)
		{
			byteInstance = new PrimitiveTypeWrapper("java.lang.Byte", //$NON-NLS-1$
					"byteValue()"); //$NON-NLS-1$
		}

		return byteInstance;
	}

	public static PrimitiveTypeWrapper getCharacterInstance()
	{
		if (characterInstance == null)
		{
			characterInstance = new PrimitiveTypeWrapper("java.lang.Character", //$NON-NLS-1$
					"charValue()"); //$NON-NLS-1$
		}

		return characterInstance;
	}

	public static PrimitiveTypeWrapper getDoubleInstance()
	{
		if (doubleInstance == null)
		{
			doubleInstance = new PrimitiveTypeWrapper("java.lang.Double", //$NON-NLS-1$
					"doubleValue()"); //$NON-NLS-1$
		}

		return doubleInstance;
	}

	public static PrimitiveTypeWrapper getFloatInstance()
	{
		if (floatInstance == null)
		{
			floatInstance = new PrimitiveTypeWrapper("java.lang.Float", //$NON-NLS-1$
					"floatValue()"); //$NON-NLS-1$
		}

		return floatInstance;
	}

	public static PrimitiveTypeWrapper getIntegerInstance()
	{
		if (integerInstance == null)
		{
			integerInstance = new PrimitiveTypeWrapper("java.lang.Integer", //$NON-NLS-1$
					"intValue()"); //$NON-NLS-1$
		}

		return integerInstance;
	}

	public static PrimitiveTypeWrapper getLongInstance()
	{
		if (longInstance == null)
		{
			longInstance = new PrimitiveTypeWrapper("java.lang.Long", //$NON-NLS-1$
					"longValue()"); //$NON-NLS-1$
		}

		return longInstance;
	}

	public static PrimitiveTypeWrapper getShortInstance()
	{
		if (shortInstance == null)
		{
			shortInstance = new PrimitiveTypeWrapper("java.lang.Short", //$NON-NLS-1$
					"shortValue()"); //$NON-NLS-1$
		}

		return shortInstance;
	}
}
